export { }
// 泛型：我们需要一种方法使返回值的类型与传入参数的类型是相同的。 这里，我们使用了类型变量，它是一种特殊的变量，只用于表示类型而不是值。

// 写个函数，调用后返回一个数组

function createNumberArray(length: number, value: number): number[] {
  //  Array(length) : 创建一个指定长度的数组
  // fill(value)： 用指定的值来填充每一个数组元素
  let arr: Array<number> = Array(length).fill(value)
  return arr
}

let a = createNumberArray(5, 10);
console.log(a); // [ 10, 10, 10, 10, 10 ]

function createStringArray(length: number, value: string): string[] {
  let arr: Array<string> = Array(length).fill(value)
  return arr
}
let b = createStringArray(5, "hello")
console.log(b); // [ 'hello', 'hello', 'hello', 'hello', 'hello' ]

// 如果要合并这2个函数，写一成一个函数，我们可以写成一个返回泛型的数组的泛型函数；
// T,表示 泛型，在函数名和数组Array后面，用<T>,来表示泛型
// 调用 函数时，给传递一个数据类型后，原函数中所的T，都是同一个数据类型。  <T> 可以接收任何的数据类型。

function createArray<T>(length: number, value: T): T[] {
  // let arr:T[] = Array(length).fill(value)
  let arr:Array<T> = Array(length).fill(value)
  return arr;
}
let c: Array<string> =  createArray<string>(5,"abc")
console.log(c);//[ 'abc', 'abc', 'abc', 'abc', 'abc' ]

let d:number[] = createArray<number>(5, 100);
console.log(d); // [ 100, 100, 100, 100, 100 ]

interface User {
  name:string
  age: number
  [prop:string]: string | number | boolean | Array<any>
}
let list:Array<User> = createArray<User>(5,{name:'张3',age: 23})
console.log(list);
/**
 * [
  { name: '张3', age: 23 },
  { name: '张3', age: 23 },
  { name: '张3', age: 23 },
  { name: '张3', age: 23 },
  { name: '张3', age: 23 }
]
 */

